# 静态化首页
from apps.contents.models import GoodsChannel, ContentCategory
from django.template import loader
import os
from django.conf import settings


"""
定时生成静态页面:
    添加定时任务到系统中  python manage.py crontab add
    显示已经激活的定时任务  python manage.py crontab show
    移除定时任务  python manage.py crontab remove
"""


def generate_static_index_html():
    """生成静态的首页html文件"""
    # =======================================生成字典格式数据=======================================
    # 准备商品分类数据的字典容器
    categories = {}

    # 查询所有的37个频道(一级分类)
    # GoodsChannel.objects.all().order_by('group_id', 'sequence')
    # 对GoodsChannel进行 group_id和sequence排序,获取排序后的结果
    channels = GoodsChannel.objects.order_by('group_id', 'sequence')
    # 遍历所有的频道,取出每一个频道数据(一级)
    for channel in channels:
        # 通过频道数据关联的组,取出对应的组号
        group_id = channel.group.id
        # 通过频道数据关联的组,取出对应的组号
        if group_id not in categories:
            # 将group_id作为字典的key
            categories[group_id] = {'channels': [], 'sub_cats': []}

        # 获取当前频道关联的一级分类(一个频道对应一个一级分类)
        cat1 = channel.category
        # 添加每组中对应的频道数据
        categories[group_id]['channels'].append({
            'id': channel.id,
            'name': cat1.name,
            'url': channel.url
        })

        for cat2 in cat1.subs.all():
            # 使用二级分类查询关联的三级分类
            sub_cats = []
            for cat3 in cat2.subs.all():
                sub_cats.append({
                    'id': cat3.id,  # 三级分类id
                    'name': cat3.name
                })
            # 添加每组中的二级和三级分类
            categories[group_id]['sub_cats'].append({
                'id': cat2.id,  # 二级分类id
                'name': cat2.name,  # 二级分类名称
                'sub_cats': sub_cats,  # 二级关联的三级分类
            })

    # =======================================首页广告数据=======================================
    # 查询首页广告数据
    contents = {}
    # 先查询所有的广告种类,遍历出每一种广告分类
    content_categories = ContentCategory.objects.all()
    for content_cat in content_categories:
        # 再遍历的过程中,取出每一种广告关联的广告内容
        # 一查多:一方模型类对象.一查多关联字段
        contents[content_cat.key] = content_cat.content_set.filter(status=True).order_by('sequence')

        # for content in content_cat.content_set.filter(status=True).order_by('sequence'):
        #     content.image = 'http://192.168.103:100:8888/' + content.image

    # 构造渲染html页面的上下文字典
    context = {
        'categories': categories,
        'contents': contents
    }

    # 渲染页面数据,得到页面对应的html字符串
    # 获取模板文件目录templates中的index.html
    template = loader.get_template('index.html')
    # 使用上下文字典context的数据区渲染index.html
    index_html_str = template.render(context)

    # 将渲染好的Html字符串保存到静态文件中
    file_path = os.path.join(os.path.dirname(os.path.dirname(settings.BASE_DIR)), 'front_end_pc/index.html')
    with open(file_path, 'w', encoding='utf-8') as f:
        f.write(index_html_str)
